package com.oop.ch10;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 对user表的一些增删查改方法
 */
public class UserDao extends BaseDao{
	/**
	 * 新增用户
	 * @param user
	 * @return int
	 */
	public int add(User user){
		//1、准备新增的sql语句，遇到参数需要添加？
		String sql="insert into user (mobile,password,name,sex,birthday,regtime) values(?,?,?,?,?,?)";
		//2、准备Object的数组，参数数组
		Object[] param={
				user.getMobile(),
				user.getPassword(),
				user.getName(),
				user.getSex(),
				user.getBirthday(),
				user.getRegtime()
		};
		//返回受影响的行数
		int count=this.executeUpdate(sql, param);
		return count;
	}
	
	/**
	 * 根据用户id修改用户信息
	 * @param user 对象
	 * @return int
	 */
	public int update(User user){
		//sql
		String sql="update user set name=?,age=?,sex=? where id=?";
		//Object[]
		Object[] param={
				user.getName(),
				user.getAge(),
				user.getSex(),
				user.getId()
		};
		
		int count=this.executeUpdate(sql, param);
		return count;
	}
	
	/**
	 * 根据用户id(主键)删除一条数据
	 * @return
	 */
	public int delete(int id){
		String sql="delete from user where id=?";
		Object[] param={id};
		return this.executeUpdate(sql, param);
	}
	
	/**
	 * 查询所有用户的记录
	 * @return List
	 */
	public List<User> selectAll(){
		//part1 定义操作对象部分
		List<User> list=null;//定义返回的记录集
		Connection conn=null;//定义数据库连接对象
		PreparedStatement pst=null;//定义预编译对象
		ResultSet rs=null;//数据库的结果集对象（仅用在查询时候）
		try {
			String sql="select * from user";//定义查询的sql语句
			list=new ArrayList<>();//初始化集合
			conn=this.getConn();//从父类中调用获取数据库连接对象的方法
			pst=conn.prepareStatement(sql);//根据数据库连接对象Connection获取预编译对象
			rs=pst.executeQuery();//预编译对象执行查询的sql，返回结果集对象ResultSet
			while (rs.next()){//开始循环结果集，然后从结果集对象中遍历每一条数据
				User user=new User();
				// user.setId(rs.getInt("id"));//获取结果集当前行对应id字段的值，然后存储到user对象的id属性
				// user.setName(rs.getString("name"));//获取结果集当前行对应name字段的值，然后存储到user对象的name属性
				// user.setAge(rs.getInt("age"));//获取结果集当前行对应age字段的值，然后存储到user对象的age属性
				// user.setSex(rs.getString("sex"));//获取结果集当前行对应sex字段的值，然后存储到user对象的sex属性
				this.setUser(user, rs);
				list.add(user);//list存储每次遍历的user对象
			}
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			this.closeAll(conn, pst, rs);
		}
		return list;
	}
	
	//数据库中的表(user)<--->类(User user)
	/**
	 * 根据用户id查询用户对象
	 * @param id 用户id
	 * @return User
	 */
	public User selectOne(Integer id){
		//part1 定义操作对象
		User user=null;//定义返回对象
		Connection conn=null;//定义数据库连接对象
		PreparedStatement pst=null;//定义预编译对象
		ResultSet rs=null;//定义查询的结果集对象
		//part2 try 执行的代码体
		try {
			String sql="select * from user where id=?";
			conn=this.getConn();
			pst=conn.prepareStatement(sql);
			pst.setInt(1, id);
			rs=pst.executeQuery();
			while (rs.next()){//这次查询是否有结果
				user=new User();//如果记录，则实例化user对象
				//对象都是引用类型，
				this.setUser(user, rs);
				// user.setId(rs.getInt("id"));
				// user.setName(rs.getString("name"));
				// user.setSex(rs.getString("sex"));
				// user.setAge(rs.getInt("age"));
			}
		}catch (Exception e){//part3 异常处理
			e.printStackTrace();
		}finally {//part4 关闭数据库操作对象
			this.closeAll(conn, pst, rs);
		}
		//part5 返回
		return user;
	}
	
	/**
	 * 根据手机号查询是否存在这个用户
	 * @param mobile 账号
	 * @return User
	 */
	public User selectByMobile(String mobile){
		//part1 定义操作对象
		User user=null;//定义返回对象
		Connection conn=null;//定义数据库连接对象
		PreparedStatement pst=null;//定义预编译对象
		ResultSet rs=null;//定义查询的结果集对象
		//part2 try 执行的代码体
		try {
			String sql="select * from user where mobile=?";
			conn=this.getConn();
			pst=conn.prepareStatement(sql);
			pst.setString(1, mobile);
			rs=pst.executeQuery();
			while (rs.next()){//这次查询是否有结果
				user=new User();//如果记录，则实例化user对象
				//对象都是引用类型，
				this.setUser(user, rs);
			}
		}catch (Exception e){//part3 异常处理
			e.printStackTrace();
		}finally {//part4 关闭数据库操作对象
			this.closeAll(conn, pst, rs);
		}
		//part5 返回
		return user;
	}
	
	/*
		登录：
		1、返回值
			A  boolean true/false
			B  字符串  成功 失败，账号密码错误
			C  返回User 可以获取任何属性的值，user==null，user=new User,set
	    2、参数
	        A 账号 和 密码 public User login(String mobile,String password)
	        B User对象 public User login(User user)
	 */
	
	/**
	 * 用户登录
	 * @param param user对象
	 * @return User
	 */
	public User login(User param){
		//-------------------
		User online=null;
		Connection conn=null;
		PreparedStatement pst=null;//预编译 sql语句的编译 //sql注入 不安全
		ResultSet rs=null;
		try {
			// String sql="select * from user where mobile='"+param.getMobile()+"' and password='"+param.getPassword()+"'";
			String sql="select * from user where mobile=? and password=?";
			conn=this.getConn();
			pst=conn.prepareStatement(sql);
			pst.setString(1, param.getMobile());
			pst.setString(2, param.getPassword());
			rs= pst.executeQuery();
			while (rs.next()){
				online =new User();
				this.setUser(online, rs);
			}
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			this.closeAll(conn, pst, rs);
		}
		return online;
	}
	
	/**
	 * 主要是处理 把rs中的记录，转换到当前User对象的属性中
	 * @param user
	 * @param rs
	 */
	public void setUser(User user,ResultSet rs){
		try {
			user.setId(rs.getInt("id"));
			user.setName(rs.getString("name"));
			user.setSex(rs.getString("sex"));
			user.setPassword(rs.getString("password"));
			user.setMobile(rs.getString("mobile"));
			user.setBirthday(rs.getString("birthday"));
			user.setRegtime(rs.getString("regtime"));
		}catch (Exception e){
			e.printStackTrace();
		}
	}
}
